/**
 * 项目名：五位一体化工安全信息平台
 * 日期：    2019-11-25 13:04:58
 * Copyright (c) 2015- joysuch-版权所有
 */

package com.joysuch.wwyt.core.service;

import com.joysuch.wwyt.api.base.dto.ApiUserBeanDto;
import com.joysuch.wwyt.api.base.dto.ApiUserDto;
import com.joysuch.wwyt.core.bean.*;
import com.joysuch.wwyt.core.common.ajax.ResultBean;
import com.joysuch.wwyt.core.entity.BaseImageRepository;
import com.joysuch.wwyt.core.entity.BaseUser;
import com.joysuch.wwyt.core.security.ShiroUser;
import com.joysuch.wwyt.edu.bean.EduCertUserDto;
import com.joysuch.wwyt.edu.bean.EduCertUserQueryBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

public interface BaseUserService {

    public ResultBean add(BpUserListBean entity) throws Exception;

    ResultBean update(BpUserListBean entity) throws Exception;

    Page<BaseUserFindAllBean> findByPage(Pageable page, BpUserSearchBean bpUserSearchBean, Long chiefId);

    Page<BaseUserFindAllBean> findByPage(Pageable page, BpUserSearchBean bpUserSearchBean, Long chiefId, String sort, String... sortField);

    public String username(Long id);

    void delete(Long id);

    BpUserListBean findById(Long id);

    Page<BaseUserListBean> findDetailInfoByPage(Pageable page, BaseUserListSearchBean condition);

    Page<BaseUserListBean> findDetailInfoByPageWf(Pageable page, BaseUserListWfSearchBean condition);

    List<BpUserBean> getUset(String name, Long typeId);

    BpUserBean selectByUserId(Long id);

    Long fife(BaseImageRepository baseImageRepository);

    List<BpJobBean> getJob();

    List<BpWorkTypeBean> getWorkType();

    List<BpDepartBean> getDepart();


    /**
     * 完善登录用户信息
     *
     * @param userId 用户ID
     * @param user   用户信息实体
     */
    public void completeShiroUserInfo(Long userId, ShiroUser user);

    List<BaseUserFindAllBean> getRole(Long role);

    /**
     * 获取全部用户信息（内部+外来人员）总数
     *
     * @param name       筛选条件：用户名称（可模糊查询）
     * @param departName 筛选条件：部门名称（精确查询）
     * @param type       筛选条件：内外部类型[1.内部；2.外部人员]
     */
    Integer getAllUserTotalCount(String name, String departName, Integer type);

    /**
     * 获取全部用户信息（内部+外来人员）[分页]
     *
     * @param name       筛选条件：用户名称（可模糊查询）
     * @param departName 筛选条件：部门名称（精确查询）
     * @param type       筛选条件：内外部类型[1.内部；2.外部人员]
     * @param page       当前页码
     * @param pageSize   每页显示数量
     */
    List<Map<String, Object>> getAllUser(String name, String departName, Integer type, Integer page, Integer pageSize);

    BaseUser findByCode(String username, String companyCode);

    /**
     * 查找所有没有登录账号的用户列表
     *
     * @param excludeUserCodes 需排除的用户列表
     * @return 无登录账号的用户列表
     */
    List<BaseUser> findAllNoLoginAccountUsers(String[] excludeUserCodes);

    Page<BaseUserListBean> findDetailInfoWithExamScoreByPage(Pageable page, BaseUserListSearchBean condition,
                                                             Long examId);

    /**
     * 模糊匹配，查询包含userName的人员ID
     *
     * @param userName
     * @return
     */
    List<Long> queryUserIdsByNameContains(String userName);

    ResultBean getPwdBack(BaseUserPwdDto baseUserPwdDto);

    ResultBean auditPwd(BaseUserPwdDto baseUserPwdDto);

    ResultBean editPwd(BaseUserPwdDto baseUserPwdDto);

    ResultBean getIdByName(String name);

    // 获取用户所在部门负责人信息
    BaseDepartDutyUserBean getDepartDutyUser(Long userId);

    List<ApiUserDto> getDepartDutyUserList(Long departId, Integer level);

    List<SimpleSelectListBean> getUserSimpleList();

    ResultBean locateSyncUser(Integer flag, List<Long> userIds);

    Page<BaseCreditCardRecordBean> getCreditCardRecord(Pageable page, BaseCreditCardRecordSearchBean condition);

    ResultBean getCreditCardUserDetail(Integer typeFlag, String code);

    void setShowNumber(List<BaseUserFindAllBean> list);

    ResultBean getAllFields(Pageable pageable);

    BaseUser editAlarmTemplate(Long userId, Long templateId, String templateName);

    ResultBean getIdBySn(String sn);

    BaseUserCardNumBean findUserInfoByCardNumber(List<Long> certIds, String cardNumber, boolean userContractorFlag);

    void checkUser(String cardNumber, String sn, String flag);

    public BatchUploadResult batchUploadIdImages(MultipartFile file, String type);

    /**
     * 查询部门ID的子部门，结果集中包含当前部门ID，为列表的第一个元素
     *
     * @param chiefId
     * @return
     */
    List<Long> findDepartAndSubDepartIds(Long chiefId);

    List<EduCertUserDto> getUserOrContractorUserList(EduCertUserQueryBean bean);

    List<BaseJobAndUserBean> findUserByJobIds(List<Long> jobIds);

    /**
     * 根据岗位或者部门id 获取该岗位或部门下所有人的用户id
     *
     * @param orgType   J 岗位 D 部门
     * @param targetIds
     * @return
     */
    List<Long> findUserIdsByTargetIds(String orgType, List<Long> targetIds);

    int getUserOrContractorUserCount(EduCertUserQueryBean bean);

    List<SimpleUserBean> findUserSimpleList(Integer userContractorFlag);

    /**
     * 查看人员数据
     *
     * @param departIds
     * @param jobIds
     * @param roleIds
     * @return
     */
    List<ApiUserDto> findUserList(String departIds, String jobIds, String roleIds, String userIds, Long tenantId, String orgCode);

    /**
     * 分页查看人员数据
     *
     * @param page
     * @param size
     * @param departIds
     * @param jobIds
     * @param roleIds
     * @param userIds
     * @param userName
     * @param departName
     * @param tenantId
     * @param orgCode
     * @return
     */
    ResultBean findUserListByPage(Integer page, Integer size,
                                  String departIds,
                                  String jobIds,
                                  String roleIds,
                                  String userIds,
                                  String userName,
                                  String departName,
                                  String code,
                                  Long tenantId,
                                  String orgCode
    );

    List<BpDepartBean> getNewDepart(Long jobId);

    List<BpJobBean> getNewJob(Long departId);

    /**
     * 是否需要弹出签名
     * @param currentUserId
     * @return
     */
    boolean needAutograph(Long currentUserId);

    void updateAutograph(String autograph,String flowSignature,Long currentUserId);

    Long selectUserIdByName(String userName);
    Long countNumByName(String userName);

    List<ApiUserBeanDto> findBeanList(String userIdStr,String userNameStr,Long tenantId, String orgCode);

    /**
     * 同步人脸
     * @param ids
     * @return
     */
    ResultBean syncFace(List<Long> ids);

/*    void updateFace(List<BaseUser> userList);*/

   List<BaseUser> getAllByIdsAndShowState(List<Long> ids);

    List<BaseUserDepartBean> findUserByDepart(BaseUserDepartJobBean bean);
}
